package br.com.pb.bymychef.persistencia.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "tb_receita")
@SequenceGenerator(name = "S_TB_RECEITA", sequenceName = "S_TB_RECEITA", initialValue = 0, allocationSize = 1)
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement
public class Receita implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_TB_RECEITA")
    @Column(name = "idReceita")
    private Long idReceita;
    @OneToMany(mappedBy = "receita", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ImagemReceita> imagensReceita;
    @OneToMany(mappedBy = "receita", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ModoPreparo> modosPreparo;
    @OneToMany(mappedBy = "receita", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    private List<Ingrediente> ingredientes;
    @Column(name = "nomeReceita", length = 255, nullable = false)
    private String nomeReceita;
    @Column(name = "tpReceita", nullable = false)
    private int tpReceita;
    @Column(name = "tpSituacao", nullable = false)
    private int tpSituacao;

    
    public Receita() {
	
	
    }
    
    public Receita(int tpReceita) {
	super();
	this.tpReceita = tpReceita;

    }

    public Receita(List<ImagemReceita> imagensReceita,
	    List<ModoPreparo> modosPreparo, List<Ingrediente> ingredientes,
	    String nomeReceita, int tpReceita, int tpSituacao) {
	super();
	this.imagensReceita = imagensReceita;
	this.modosPreparo = modosPreparo;
	this.ingredientes = ingredientes;
	this.nomeReceita = nomeReceita;
	this.tpReceita = tpReceita;
	this.tpSituacao = tpSituacao;
    }

    public enum TpReceita {

	TP_RECEITA_CRAWLER(1), TP_RECEITA_USR(2);

	private int value;

	private TpReceita(int value) {

	    this.value = value;

	}

	public int getValue() {
	    return value;
	}

    }

    public Long getIdReceita() {
	return idReceita;
    }

    public void setIdReceita(Long idReceita) {
	this.idReceita = idReceita;
    }

    public List<ImagemReceita> getImagensReceita() {
	return imagensReceita;
    }

    public void setImagensReceita(List<ImagemReceita> imagensReceita) {
	this.imagensReceita = imagensReceita;
    }

    public List<ModoPreparo> getModosPreparo() {
	return modosPreparo;
    }

    public void setModosPreparo(List<ModoPreparo> modosPreparo) {
	this.modosPreparo = modosPreparo;
    }

    public List<Ingrediente> getIngredientes() {
	return ingredientes;
    }

    public String getNomeReceita() {
	return nomeReceita;
    }

    public void setNomeReceita(String nomeReceita) {
	this.nomeReceita = nomeReceita;
    }

    public void setIngredientes(List<Ingrediente> ingredientes) {
	this.ingredientes = ingredientes;
    }

    public int getTpReceita() {
	return tpReceita;
    }

    public int getTpSituacao() {
	return tpSituacao;
    }

    public void setTpSituacao(int tpSituacao) {
	this.tpSituacao = tpSituacao;
    }

    public void setTpReceita(int tpReceita) {
	this.tpReceita = tpReceita;
    }

    public void addModoDePreparo(ModoPreparo modoPreparo) {

	if (this.modosPreparo == null)
	    this.modosPreparo = new ArrayList<ModoPreparo>();
	this.modosPreparo.add(modoPreparo);

    }

    public void removeModoDePreparo(ModoPreparo modoPreparo) {

	if (this.modosPreparo != null)
	    this.modosPreparo.remove(modoPreparo);

    }
    
    public void addImagemReceita(ImagemReceita imagemReceita) {

	if (this.imagensReceita == null)
	    this.imagensReceita = new ArrayList<ImagemReceita>();
	this.imagensReceita.add(imagemReceita);

    }

    public void removeImagemReceita(ImagemReceita imagemReceita) {

	if (this.imagensReceita != null)
	    this.imagensReceita.remove(imagemReceita);

    }

    public void addIngrediente(Ingrediente ingrediente) {
	
	if (this.ingredientes == null)
	    this.ingredientes = new ArrayList<Ingrediente>();
	this.ingredientes.add(ingrediente);
	
    }
    
    public void removeIngrediente(Ingrediente ingrediente) {
	
	if (this.ingredientes != null)
	    this.ingredientes.remove(ingrediente);
	
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result
		+ ((idReceita == null) ? 0 : idReceita.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	Receita other = (Receita) obj;
	if (idReceita == null) {
	    if (other.idReceita != null)
		return false;
	} else if (!idReceita.equals(other.idReceita))
	    return false;
	return true;
    }

}
